package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.common.MyException;
import com.itheima.vo.R;
import com.itheima.dto.menu.FuMenuDto;
import com.itheima.dto.menu.MenuDto;
import com.itheima.entity.SysMenu;
import com.itheima.service.MenuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangpei
 * @ClassName MenuController
 * @date 2022/5/25/11:01
 */
@RequestMapping("/sys_menu")
@RestController
@Slf4j
public class MenuController {
    @Autowired
    private MenuService menuService;

    /**
     * 菜单管理 数据显示
     *
     * @return
     */
    @GetMapping("/allData")
    public R<List<FuMenuDto>> allData()     {
        //新建 FuMenuDto list 装所有的 子菜单 和子菜单的子菜单 最高父
        List<FuMenuDto> fuMenuDtoList = new ArrayList<>();
        //查询所有 菜单信息
        List<SysMenu> menuList = menuService.list();
        for (int i = 0; i < menuList.size(); i++) {
            //获取父id
            Integer pid = menuList.get(i).getPid();
            //父id为0 说明没有父菜单
            if (0 == pid) {
                FuMenuDto fuMenuDto = new FuMenuDto();
                BeanUtils.copyProperties(menuList.get(i), fuMenuDto);
                fuMenuDtoList.add(fuMenuDto);
                menuList.remove(menuList.get(i));
                i--;
            }
        }
        //主菜单的子菜单
        for (FuMenuDto fuMenuDto : fuMenuDtoList) {
            //建个集合存 主菜单的子菜单 menuDtoList
            ArrayList<MenuDto> menuDtoList = new ArrayList<>();
            //取到主菜单的 id
            Integer fuMenuDtoId = fuMenuDto.getId();
            for (int i = 0; i < menuList.size(); i++) {
                //取到子菜单的 父 id 和 主菜单的id 比较 相等 就把 当前菜单 存到 主菜单的子菜单集合中
                Integer pid = menuList.get(i).getPid();
                if (pid.equals(fuMenuDtoId)) {
                    MenuDto menuDto = new MenuDto();
                    BeanUtils.copyProperties(menuList.get(i), menuDto);
                    log.info("把菜单-->"+menuList.get(i).getTitle()+"--放到主菜单下-->"+fuMenuDto.getTitle());
                    menuDtoList.add(menuDto);
                    menuList.remove(menuList.get(i));
                    //每次都是从头删除的 i-- 让他又从 0 索引开始 对比
                    i--;
                }
            }
            fuMenuDto.setChildren(menuDtoList);
        }
        //子菜单的子菜单
        for (FuMenuDto fuMenuDto : fuMenuDtoList) {
            //取到 主菜单的子菜单集合
            List<MenuDto> MenuDtoList = fuMenuDto.getChildren();
            for (MenuDto menuDto : MenuDtoList) {
                //建个集合存 主菜单的子菜单的子菜单  MenuList
                ArrayList<SysMenu> MenuList = new ArrayList<>();
                //取到子菜单的 id
                Integer id = menuDto.getId();
                for (int i = 0; i < menuList.size(); i++) {
                    //取到当前菜单的父id 和 子菜单的 id 对比 相等就把他放到当前子菜单的 下面
                    Integer pid = menuList.get(i).getPid();
                    if (pid.equals(id)) {
                        log.info("把菜单-->"+menuList.get(i).getTitle()+"--放到子菜单下-->"+menuDto.getTitle());
                        MenuList.add(menuList.get(i));
                    }
                }
                menuDto.setChildren(MenuList);
            }
        }
        log.info("fuMenuDtoList {}", fuMenuDtoList);
        return R.success(fuMenuDtoList);
    }

    /**
     * 修改菜单 数据回显
     *
     * @param id
     * @return
     */
    @GetMapping("/rowInfo")
    public R<SysMenu> rowInfoById(Integer id) {
        SysMenu sysMenu = menuService.getById(id);
        return R.success(sysMenu);
    }

    /**
     * 新增 菜单/按钮
     *
     * @param sysMenu
     * @return
     */
    @PostMapping("/add")
    public R<String> add(@RequestBody SysMenu sysMenu) {
        menuService.save(sysMenu);
        return R.success(null);
    }

    /**
     * 菜单删除
     * @param id
     * @return
     */
    @GetMapping("/del")
    public R<String> deleteById(Integer id) {
        //判断菜单下有没有子菜单
        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysMenu::getPid, id);
        int count = menuService.count(queryWrapper);
        if (count > 0) {
            throw new MyException("该菜单不可删除");
        }
        menuService.removeById(id);
        return R.success(null);
    }

    /**
     * 修改状态
     * @param sysMenu
     * @return
     */
    @PostMapping("/update")
    public R<String> update(@RequestBody SysMenu sysMenu) {
        menuService.updateById(sysMenu);
        return R.success(null);
    }
}
